package LeetCodeQuestionBank;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 994. 腐烂的橘子
 * 在给定的 m x n 网格 grid 中，每个单元格可以有以下三个值之一：
 *
 * 值 0 代表空单元格；
 * 值 1 代表新鲜橘子；
 * 值 2 代表腐烂的橘子。
 * 每分钟，腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
 *
 * 返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能，返回 -1 。
 *
 *
 *
 * 示例 1：
 *
 *
 *
 * 输入：grid = [[2,1,1],[1,1,0],[0,1,1]]
 * 输出：4
 * 示例 2：
 *
 * 输入：grid = [[2,1,1],[0,1,1],[1,0,1]]
 * 输出：-1
 * 解释：左下角的橘子（第 2 行， 第 0 列）永远不会腐烂，因为腐烂只会发生在 4 个正向上。
 * 示例 3：
 *
 * 输入：grid = [[0,2]]
 * 输出：0
 * 解释：因为 0 分钟时已经没有新鲜橘子了，所以答案就是 0 。
 *
 *
 * 提示：
 *
 * m == grid.length
 * n == grid[i].length
 * 1 <= m, n <= 10
 * grid[i][j] 仅为 0、1 或 2
 */
public class T994 {

    /**
     *     向这种 一圈一圈向外传播的 思路可以用bfs 使用队列实现
      */
    public int orangesRotting(int[][] grid) {

        Queue<Integer> queue = new LinkedList<>();

        int minute = -1;  //这里设置-1 时间  是因为用了do-while循环 有一种情况是没有苹果要输出0

        int x = grid.length;
        int y = grid[0].length;

        //将第一轮腐烂的橘子放入队列
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                if (grid[i][j] == 2) {
                    queue.add(i * y + j); //使用这种方法保存坐标 行标*列宽+列标
                }
            }
        }


        do {

            int size = queue.size(); //上一轮腐烂的苹果数量

            for (int i = 1; i <= size; i++) {

                Integer element = queue.poll();
                int x1 = element / y; //行标
                int y1 = element % y; //列标

                //该橘子的上方的橘子被腐烂 并将腐烂橘子的坐标放入队列
                if (x1 > 0 && grid[x1 - 1][y1] == 1) {
                    grid[x1 - 1][y1] = 2;
                    queue.add((x1 - 1) * y + y1);
                }

                //下
                if (x1 < x - 1 && grid[x1 + 1][y1] == 1) {
                    grid[x1 + 1][y1] = 2;
                    queue.add((x1 + 1) * y + y1);
                }

                //左
                if (y1 > 0 && grid[x1][y1 - 1] == 1) {
                    grid[x1][y1 - 1] = 2;
                    queue.add(x1 * y + y1 - 1);
                }

                //右
                if (y1 < y - 1 && grid[x1][y1 + 1] == 1) {
                    grid[x1][y1 + 1] = 2;
                    queue.add(x1 * y + y1 + 1);
                }


            }

            minute++;

        } while (!queue.isEmpty());

        //检查一下是否还有新鲜的苹果
        for (int[] ints : grid) {
            for (int j = 0; j < y; j++) {
                if (ints[j] == 1) {
                    return -1;
                }
            }
        }

        return minute;

    }

}
